package org.coopac.controller;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.RequestScoped;
import javax.faces.bean.SessionScoped;
import javax.faces.event.ActionEvent;

import org.coopac.controller.util.CreditoDataModel;
import org.coopac.controller.util.CuentaDataModel;
import org.coopac.model.CoopacConsultaSocioPotencial;
import org.coopac.model.CoopacDetalleConsultaSocioPotencial;
import org.coopac.model.CoopacDireccionPersona;
import org.coopac.model.CoopacDocumentoPersona;
import org.coopac.model.CoopacPersona;
import org.coopac.model.CoopacRelacionPersona;
import org.coopac.model.CoopacTelefonoPersona;
import org.coopac.model.CoopacTipoCredito;
import org.coopac.model.CoopacTipoCuenta;
import org.coopac.model.CoopacTipoMaestro;
import org.coopac.model.CoopacUbigeo;
import org.coopac.service.IConsultaSocioPotencialService;
import org.coopac.service.IDetalleConsultaSocioPotencialService;
import org.coopac.service.IDireccionPersonaService;
import org.coopac.service.IDocumentoPersonaService;
import org.coopac.service.IPersonaService;
import org.coopac.service.IRelacionPersonaService;
import org.coopac.service.ITelefonoPersonaService;
import org.coopac.service.ITipoCreditoService;
import org.coopac.service.ITipoCuentaService;
import org.coopac.service.ITipoMaestroService;
import org.coopac.service.IUbigeoService;

@ManagedBean(name="empresa")
@RequestScoped
public class EmpresaController implements Serializable {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	@ManagedProperty(value="#{personaService}")
	IPersonaService personaServicio;
	CoopacPersona personaJ;
	CoopacPersona personaN;
	
	
	@ManagedProperty(value="#{documentoPersonaService}")
	IDocumentoPersonaService documentoService;
	CoopacDocumentoPersona documentoPersonaJ;
	CoopacDocumentoPersona documentoPersonaN;
	
	@ManagedProperty(value="#{telefonoPersonaService}")
	ITelefonoPersonaService telefonoService;
	CoopacTelefonoPersona telefonoPersonaJ;
	
	@ManagedProperty(value="#{direccionPersonaService}")
	IDireccionPersonaService direccionService;
	CoopacDireccionPersona direccionPersonaJ;
	
	@ManagedProperty(value="#{relacionPersonaService}")
	IRelacionPersonaService relacionPersonaService;
	CoopacRelacionPersona relacionPersona;
	
	@ManagedProperty(value="#{ubigeoService}")
	IUbigeoService ubigeoService;
	CoopacUbigeo ubigego;
	
	@ManagedProperty(value="#{tipoMaestroService}")
	ITipoMaestroService tipoMaestroService;
	CoopacTipoMaestro coopacTipoMaestro;	

	@ManagedProperty(value = "#{tipoCuentaService}")
	ITipoCuentaService tipoCuentaService;

	@ManagedProperty(value = "#{tipoCreditoService}")
	ITipoCreditoService tipoCreditoService;

	@ManagedProperty(value = "#{consultaSocioPotencialService}")
	IConsultaSocioPotencialService consultaSocioPotencialService;
	CoopacConsultaSocioPotencial coopacConsultaSocioPotencial;

	@ManagedProperty(value = "#{detalleConsultaSocioPotencialService}")
	IDetalleConsultaSocioPotencialService detalleConsultaSocioPotencialService;
	CoopacDetalleConsultaSocioPotencial coopacDetalleConsultaSocioPotencial;
	
	CoopacTipoMaestro tipoMaestroPersona;
	CoopacTipoMaestro tipoMaestroRuc;
	CoopacTipoMaestro tipoMaestroZona;
	CoopacTipoMaestro tipoMaestroVia;
	CoopacTipoMaestro tipoMaestroTipoVivienda;
	CoopacTipoMaestro tipoMaestroDni;
	CoopacTipoMaestro tipoMaestroTipoTelefono;
	CoopacTipoMaestro tipoMaestroRelacionPersona;
	
	private Integer idDistrito;
	private Integer idCTMNatural;
	private Integer idCTMZona;
	private Integer idCTMVia;
	private Integer idCTMVivienda;
	private Integer idCTMTelf;
	private String numero;
	

	

	public EmpresaController(){
		ubigego = new CoopacUbigeo();
		personaJ = new CoopacPersona();
		personaN = new CoopacPersona();
		documentoPersonaJ = new CoopacDocumentoPersona();
		documentoPersonaN = new CoopacDocumentoPersona();
		telefonoPersonaJ = new CoopacTelefonoPersona();
		direccionPersonaJ = new CoopacDireccionPersona();
		tipoMaestroPersona = new CoopacTipoMaestro();
		tipoMaestroRuc = new CoopacTipoMaestro();
		tipoMaestroZona= new CoopacTipoMaestro();
		tipoMaestroVia = new CoopacTipoMaestro();
		tipoMaestroTipoVivienda = new CoopacTipoMaestro();
		tipoMaestroDni = new CoopacTipoMaestro();
		tipoMaestroTipoTelefono = new CoopacTipoMaestro(); 
		tipoMaestroRelacionPersona = new CoopacTipoMaestro();
		coopacTipoMaestro = new CoopacTipoMaestro();
		relacionPersona = new CoopacRelacionPersona();
		coopacConsultaSocioPotencial = new CoopacConsultaSocioPotencial();
		coopacDetalleConsultaSocioPotencial = new CoopacDetalleConsultaSocioPotencial();
		idDistrito=120801;
	}

	public IUbigeoService getUbigeoService() {
		return ubigeoService;
	}
	public void setUbigeoService(IUbigeoService ubigeoService) {
		this.ubigeoService = ubigeoService;
	}
	public ITipoMaestroService getTipoMaestroService() {
		return tipoMaestroService;
	}
	public void setTipoMaestroService(ITipoMaestroService tipoMaestroService) {
		this.tipoMaestroService = tipoMaestroService;
	}
	
	public String getNumero() {
		return numero;
	}

	public void setNumero(String numero) {
		this.numero = numero;
	}
	
	public CoopacUbigeo getUbigego() {
		return ubigego;
	}
	public void setUbigego(CoopacUbigeo ubigego) {
		this.ubigego = ubigego;
	}
	public IPersonaService getPersonaServicio() {
		return personaServicio;
	}
	public void setPersonaServicio(IPersonaService personaServicio) {
		this.personaServicio = personaServicio;
	}
	public CoopacPersona getPersonaJ() {
		return personaJ;
	}
	public void setPersonaJ(CoopacPersona personaJ) {
		this.personaJ = personaJ;
	}
	public CoopacPersona getPersonaN() {
		return personaN;
	}
	public void setPersonaN(CoopacPersona personaN) {
		this.personaN = personaN;
	}
	public IDocumentoPersonaService getDocumentoService() {
		return documentoService;
	}
	public void setDocumentoService(IDocumentoPersonaService documentoService) {
		this.documentoService = documentoService;
	}
	public CoopacDocumentoPersona getDocumentoPersonaJ() {
		return documentoPersonaJ;
	}
	public void setDocumentoPersonaJ(CoopacDocumentoPersona documentoPersonaJ) {
		this.documentoPersonaJ = documentoPersonaJ;
	}
	public CoopacDocumentoPersona getDocumentoPersonaN() {
		return documentoPersonaN;
	}
	public void setDocumentoPersonaN(CoopacDocumentoPersona documentoPersonaN) {
		this.documentoPersonaN = documentoPersonaN;
	}
	public ITelefonoPersonaService getTelefonoService() {
		return telefonoService;
	}
	public void setTelefonoService(ITelefonoPersonaService telefonoService) {
		this.telefonoService = telefonoService;
	}
	public CoopacTelefonoPersona getTelefonoPersonaJ() {
		return telefonoPersonaJ;
	}
	public void setTelefonoPersonaJ(CoopacTelefonoPersona telefonoPersonaJ) {
		this.telefonoPersonaJ = telefonoPersonaJ;
	}
	public IDireccionPersonaService getDireccionService() {
		return direccionService;
	}
	public void setDireccionService(IDireccionPersonaService direccionService) {
		this.direccionService = direccionService;
	}
	public CoopacDireccionPersona getDireccionPersonaJ() {
		return direccionPersonaJ;
	}
	public void setDireccionPersonaJ(CoopacDireccionPersona direccionPersonaJ) {
		this.direccionPersonaJ = direccionPersonaJ;
	}
	public CoopacTipoMaestro getTipoMaestroRuc() {
		return tipoMaestroRuc;
	}
	public void setTipoMaestroRuc(CoopacTipoMaestro tipoMaestroRuc) {
		this.tipoMaestroRuc = tipoMaestroRuc;
	}
	public CoopacTipoMaestro getTipoMaestroZona() {
		return tipoMaestroZona;
	}
	public void setTipoMaestroZona(CoopacTipoMaestro tipoMaestroZona) {
		this.tipoMaestroZona = tipoMaestroZona;
	}
	public CoopacTipoMaestro getTipoMaestroVia() {
		return tipoMaestroVia;
	}
	public void setTipoMaestroVia(CoopacTipoMaestro tipoMaestroVia) {
		this.tipoMaestroVia = tipoMaestroVia;
	}
	public CoopacTipoMaestro getTipoMaestroTipoVivienda() {
		return tipoMaestroTipoVivienda;
	}
	public void setTipoMaestroTipoVivienda(CoopacTipoMaestro tipoMaestroTipoVivienda) {
		this.tipoMaestroTipoVivienda = tipoMaestroTipoVivienda;
	}
	public CoopacTipoMaestro getTipoMaestroDni() {
		return tipoMaestroDni;
	}
	public void setTipoMaestroDni(CoopacTipoMaestro tipoMaestroDni) {
		this.tipoMaestroDni = tipoMaestroDni;
	}

	public CoopacTipoMaestro getTipoMaestroPersona() {
		return tipoMaestroPersona;
	}


	public void setTipoMaestroPersona(CoopacTipoMaestro tipoMaestroPersona) {
		this.tipoMaestroPersona = tipoMaestroPersona;
	}
	
	public CoopacTipoMaestro getTipoMaestroTipoTelefono() {
		return tipoMaestroTipoTelefono;
	}

	public void setTipoMaestroTipoTelefono(CoopacTipoMaestro tipoMaestroTipoTelefono) {
		this.tipoMaestroTipoTelefono = tipoMaestroTipoTelefono;
	}
	
	public Integer getIdDistrito() {
		return idDistrito;
	}

	public void setIdDistrito(Integer idDistrito) {
		this.idDistrito = idDistrito;
	}

	public CoopacTipoMaestro getCoopacTipoMaestro() {
		return coopacTipoMaestro;
	}
	public void setCoopacTipoMaestro(CoopacTipoMaestro coopacTipoMaestro) {
		this.coopacTipoMaestro = coopacTipoMaestro;
	}

	public Integer getIdCTMZona() {
		return idCTMZona;
	}
	public void setIdCTMZona(Integer idCTMZona) {
		this.idCTMZona = idCTMZona;
	}
	public Integer getIdCTMVia() {
		return idCTMVia;
	}

	public void setIdCTMVia(Integer idCTMVia) {
		this.idCTMVia = idCTMVia;
	}
	
	public Integer getIdCTMVivienda() {
		return idCTMVivienda;
	}
	
	public void setIdCTMVivienda(Integer idCTMVivienda) {
		this.idCTMVivienda = idCTMVivienda;
	}
	
	public Integer getIdCTMNatural() {
		return idCTMNatural;
	}
	
	public void setIdCTMNatural(Integer idCTMNatural) {
		this.idCTMNatural = idCTMNatural;
	}
	

	public Integer getIdCTMTelf() {
		return idCTMTelf;
	}

	public void setIdCTMTelf(Integer idCTMTelf) {
		this.idCTMTelf = idCTMTelf;
	}

	public IRelacionPersonaService getRelacionPersonaService() {
		return relacionPersonaService;
	}
	public void setRelacionPersonaService(
			IRelacionPersonaService relacionPersonaService) {
		this.relacionPersonaService = relacionPersonaService;
	}
	public CoopacRelacionPersona getRelacionPersona() {
		return relacionPersona;
	}
	public void setRelacionPersona(CoopacRelacionPersona relacionPersona) {
		this.relacionPersona = relacionPersona;
	}
	
	public CoopacTipoMaestro getTipoMaestroRelacionPersona() {
		return tipoMaestroRelacionPersona;
	}
	public void setTipoMaestroRelacionPersona(
			CoopacTipoMaestro tipoMaestroRelacionPersona) {
		this.tipoMaestroRelacionPersona = tipoMaestroRelacionPersona;
	}
	
	

	public ITipoCuentaService getTipoCuentaService() {
		return tipoCuentaService;
	}

	public void setTipoCuentaService(ITipoCuentaService tipoCuentaService) {
		this.tipoCuentaService = tipoCuentaService;
	}

	public ITipoCreditoService getTipoCreditoService() {
		return tipoCreditoService;
	}

	public void setTipoCreditoService(ITipoCreditoService tipoCreditoService) {
		this.tipoCreditoService = tipoCreditoService;
	}

	public IConsultaSocioPotencialService getConsultaSocioPotencialService() {
		return consultaSocioPotencialService;
	}

	public void setConsultaSocioPotencialService(
			IConsultaSocioPotencialService consultaSocioPotencialService) {
		this.consultaSocioPotencialService = consultaSocioPotencialService;
	}

	public CoopacConsultaSocioPotencial getCoopacConsultaSocioPotencial() {
		return coopacConsultaSocioPotencial;
	}

	public void setCoopacConsultaSocioPotencial(
			CoopacConsultaSocioPotencial coopacConsultaSocioPotencial) {
		this.coopacConsultaSocioPotencial = coopacConsultaSocioPotencial;
	}

	public IDetalleConsultaSocioPotencialService getDetalleConsultaSocioPotencialService() {
		return detalleConsultaSocioPotencialService;
	}

	public void setDetalleConsultaSocioPotencialService(
			IDetalleConsultaSocioPotencialService detalleConsultaSocioPotencialService) {
		this.detalleConsultaSocioPotencialService = detalleConsultaSocioPotencialService;
	}

	public CoopacDetalleConsultaSocioPotencial getCoopacDetalleConsultaSocioPotencial() {
		return coopacDetalleConsultaSocioPotencial;
	}

	public void setCoopacDetalleConsultaSocioPotencial(
			CoopacDetalleConsultaSocioPotencial coopacDetalleConsultaSocioPotencial) {
		this.coopacDetalleConsultaSocioPotencial = coopacDetalleConsultaSocioPotencial;
	}

	public void addEmpresa(ActionEvent event){
		
		tipoMaestroPersona.setIdTipoMaestro(52);
		personaJ.setCoopacTipoMaestroByIdTipoMaestroPersona(tipoMaestroPersona);
		personaJ.setFlag(true);
		personaServicio.save(personaJ);


		documentoPersonaJ.setCoopacPersona(personaJ);
		tipoMaestroRuc.setIdTipoMaestro(49);
		documentoPersonaJ.setCoopacTipoMaestro(tipoMaestroRuc);
		documentoPersonaJ.setFlag(true);
		documentoService.save(documentoPersonaJ);

		telefonoPersonaJ.setCoopacPersona(personaJ);
		tipoMaestroTipoTelefono.setIdTipoMaestro(idCTMTelf);
		telefonoPersonaJ.setCoopacTipoMaestro(tipoMaestroTipoTelefono);
		telefonoPersonaJ.setFlag(true);
		telefonoService.save(telefonoPersonaJ);


		direccionPersonaJ.setCoopacPersona(personaJ);		
		tipoMaestroZona.setIdTipoMaestro(idCTMZona);
		direccionPersonaJ.setCoopacTipoMaestroByIdTipoMaestroZona(tipoMaestroZona);		
		tipoMaestroVia.setIdTipoMaestro(idCTMVia);
		direccionPersonaJ.setCoopacTipoMaestroByIdTipoMaestroVia(tipoMaestroVia);		
		ubigego.setIdUbigeo(idDistrito);
		direccionPersonaJ.setCoopacUbigeo(ubigego);		
		direccionPersonaJ.setFlag(true);
		direccionService.save(direccionPersonaJ);


		tipoMaestroPersona.setIdTipoMaestro(51);
		personaN.setCoopacTipoMaestroByIdTipoMaestroPersona(tipoMaestroPersona);
		personaN.setFlag(true);
		personaServicio.save(personaN);
		
		tipoMaestroRelacionPersona.setIdTipoMaestro(51);
		relacionPersona.setCoopacPersonaByIdPersonaUno(personaJ);
		relacionPersona.setCoopacPersonaByIdPersonaDos(personaN);
		relacionPersona.setCoopacTipoMaestro(tipoMaestroRelacionPersona);
		relacionPersona.setFlag(true);
		relacionPersonaService.save(relacionPersona);

		documentoPersonaN.setCoopacPersona(personaN);
		tipoMaestroDni.setIdTipoMaestro(idCTMNatural);
		documentoPersonaN.setCoopacTipoMaestro(tipoMaestroDni);
		documentoPersonaN.setFlag(true);
		documentoService.save(documentoPersonaN);
	
		guardarCuentasyCreditos();
		
		limpiarCampos(event);
	}
	
	private CuentaDataModel cuentas;

	public CuentaDataModel getCuentas() {
		List<CoopacTipoCuenta> lista1 = tipoCuentaService.listar();
		cuentas = new CuentaDataModel(lista1);
		return cuentas;
	}

	public void setCuentas(CuentaDataModel cuentas) {
		this.cuentas = cuentas;
	}

	private CreditoDataModel creditos;

	public CreditoDataModel getCreditos() {
		List<CoopacTipoCredito> lista2 = tipoCreditoService.listar();
		creditos = new CreditoDataModel(lista2);
		return creditos;
	}

	public void setCreditos(CreditoDataModel creditos) {
		this.creditos = creditos;
	}

	private CoopacTipoCuenta selectedCuenta;

	private CoopacTipoCuenta[] selectedCuentas;

	public CoopacTipoCuenta getSelectedCuenta() {
		return selectedCuenta;
	}

	public void setSelectedCuenta(CoopacTipoCuenta selectedCuenta) {
		this.selectedCuenta = selectedCuenta;
	}

	public CoopacTipoCuenta[] getSelectedCuentas() {
		return selectedCuentas;
	}

	public void setSelectedCuentas(CoopacTipoCuenta[] selectedCuentas) {
		this.selectedCuentas = selectedCuentas;
	}

	private CoopacTipoCredito selectedCredito;

	private CoopacTipoCredito[] selectedCreditos;

	public CoopacTipoCredito getSelectedCredito() {
		return selectedCredito;
	}

	public void setSelectedCredito(CoopacTipoCredito selectedCredito) {
		this.selectedCredito = selectedCredito;
	}

	public CoopacTipoCredito[] getSelectedCreditos() {
		return selectedCreditos;
	}

	public void setSelectedCreditos(CoopacTipoCredito[] selectedCreditos) {
		this.selectedCreditos = selectedCreditos;
	}

	public void limpiar(ActionEvent event) {
		selectedCuentas = null;
		selectedCreditos = null;
	}
	
	
	public void limpiarCampos(ActionEvent event) {
		
		limpiar(event);
		personaJ.setApellidoPaternoRazonSocial("");
		personaJ.setNombrePersonaNombreComercial("");
		personaJ.setEmail("");
		personaJ.setPaginaWeb("");
		documentoPersonaJ.setNumero("");
		telefonoPersonaJ.setNumero("");
		telefonoPersonaJ.setAnexo("");
		direccionPersonaJ.setNombreZona("");
		direccionPersonaJ.setNombreVia("");
		direccionPersonaJ.setNumero("");
		direccionPersonaJ.setDepartamento("");
		direccionPersonaJ.setInterior("");
		direccionPersonaJ.setManzana("");
		direccionPersonaJ.setLote("");
		direccionPersonaJ.setKilometro("");
		direccionPersonaJ.setReferencia("");
		idDistrito = 120804;
		idCTMNatural = 32;
		idCTMTelf = 38;
		idCTMZona = 2;
		idCTMVia = 15;
		idCTMVivienda = 27;
		coopacConsultaSocioPotencial.setObservacion("");
		personaN.setApellidoPaternoRazonSocial("");
		personaN.setApellidoMaterno("");
		personaN.setNombrePersonaNombreComercial("");
		documentoPersonaN.setNumero("");
	}

	
	public void buscarByNumDocumento(ActionEvent event){
		CoopacDocumentoPersona documento = documentoService.getPersonaByDocumento(numero);
		Integer id = documento.getIdDocumentoPersona();
		documentoPersonaJ =  documentoService.getById(id);
		Integer id3 = documentoPersonaJ.getCoopacPersona().getIdPersona();
		personaN = personaServicio.getById(id3);
		direccionPersonaJ = direccionService.getDireccionByPersona(id3);
		telefonoPersonaJ = telefonoService.getTelefonoByPersona(id3);
		Integer id4 = direccionPersonaJ.getCoopacUbigeo().getIdUbigeo();
		ubigego = ubigeoService.getById(id4);
		Integer id5 = direccionPersonaJ.getCoopacTipoMaestroByIdTipoMaestroVia().getIdTipoMaestro();
		coopacTipoMaestro = tipoMaestroService.getById(id5);
	}
	
	public void guardarCuentasyCreditos() {

		coopacConsultaSocioPotencial.setCoopacPersona(personaN);
		coopacConsultaSocioPotencial.setFlag(true);
		consultaSocioPotencialService.save(coopacConsultaSocioPotencial);

		List<CoopacTipoCredito> lista1 = new ArrayList<CoopacTipoCredito>();
		lista1 = Arrays.asList(getSelectedCreditos());
		List<CoopacTipoCuenta> lista2 = new ArrayList<CoopacTipoCuenta>();
		lista2 = Arrays.asList(getSelectedCuentas());

		for (int i = 0; i < lista1.size(); i++) {
			coopacDetalleConsultaSocioPotencial
					.setCoopacConsultaSocioPotencial(coopacConsultaSocioPotencial);
			coopacDetalleConsultaSocioPotencial.setFlag(true);
			coopacDetalleConsultaSocioPotencial.setCoopacTipoCredito(lista1
					.get(i));
			coopacDetalleConsultaSocioPotencial.setCoopacTipoCuenta(null);
			System.out.println(lista1.get(i).getNombre());
			detalleConsultaSocioPotencialService
					.save(coopacDetalleConsultaSocioPotencial);
		}

		for (int i = 0; i < lista2.size(); i++) {
			coopacDetalleConsultaSocioPotencial
					.setCoopacConsultaSocioPotencial(coopacConsultaSocioPotencial);
			coopacDetalleConsultaSocioPotencial.setFlag(true);
			coopacDetalleConsultaSocioPotencial.setCoopacTipoCuenta(lista2
					.get(i));
			coopacDetalleConsultaSocioPotencial.setCoopacTipoCredito(null);
			System.out.println(lista2.get(i).getNombre());
			detalleConsultaSocioPotencialService
					.save(coopacDetalleConsultaSocioPotencial);
		}

	}
	
}
